package com.pinxixi.cart.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.pinxixi.api.cart.CartControllerApi;
import com.pinxixi.framework.domain.cart.ItemCart;
import com.pinxixi.framework.domain.cart.SellerCart;
import com.pinxixi.framework.domain.goods.Item;
import com.pinxixi.framework.model.response.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.security.jwt.Jwt;
import org.springframework.security.jwt.JwtHelper;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

@RestController
@CrossOrigin("*")
@RequestMapping("/cart")
public class CartController implements CartControllerApi {

    @Autowired
    private RedisTemplate redisTemplate;


    @Override
    @GetMapping("/findCart")
    public ListResponseResult findCart(HttpServletRequest request) {
        String token = request.getHeader("Authorization");
        //获取用户ID
        Jwt decode = JwtHelper.decode(token);
        String claims = decode.getClaims();
        Map map = JSON.parseObject(claims, Map.class);
        String id = (String) map.get("id");
        List list = redisTemplate.opsForList().range("cart" + id, 0, -1);
        QueryResult<Object> queryResult = new QueryResult<>();
        queryResult.setList(list);
        return new ListResponseResult(CommonCode.SUCCESS,queryResult);
    }

    @Override
    @PostMapping("/addCart")
    public ResponseResult addCart(@RequestBody SellerCart sellerCart, HttpServletRequest request) {

        String token = request.getHeader("Authorization");
        //获取用户ID
        Jwt decode = JwtHelper.decode(token);
        String claims = decode.getClaims();
        Map map = JSON.parseObject(claims, Map.class);
        String id = (String) map.get("id");

        //根据ID查询Redis中的购物车信息
        //new ArrayList(); != null
        List<SellerCart> list = redisTemplate.opsForList().range("cart" + id, 0, -1);
        //判断购物车中是否有信息。=
        if(list.isEmpty()){
            //1.如果redis中没有任何信息，新建一个店铺对象，并且为这个店铺新增一件商品
            list.add(sellerCart);
        }else{
            //2.redis中有当前用户的购物车信息
            //判断redis中是否包含当前被添加的商品所属店铺
            Boolean sellerFlag = false;
            for(SellerCart seller:list){
                //如果购物车中的店铺ID==前台页面传递过来的商品的店铺ID
                if(seller.getSellerId().equals(sellerCart.getSellerId())){
                    //店铺已经存在
                    sellerFlag = true;
                    //判断本店中的商品是否包含被添加到购物车的商品
                    Boolean itemFlag = false;
                    for(ItemCart item : seller.getItems()){
                        if(item.getSkuid().longValue()==sellerCart.getItems().get(0).getSkuid().longValue()){
                            itemFlag = true;
                            //本商品已经添加过购物车
                            item.setNum(item.getNum()+sellerCart.getItems().get(0).getNum());
                        }
                    }
                    if(!itemFlag){
                        //虽然店铺存在，但是对redis中本店铺的所有商品遍历后没有找此商品
                        seller.getItems().add(sellerCart.getItems().get(0));
                    }
                }
            }
            //如果对于所有Redis中的店铺遍历之后还是没有相等的店铺ID，说明店铺不存在
            if(!sellerFlag){
                list.add(sellerCart);
            }
        }
        redisTemplate.delete("cart"+id);
        redisTemplate.opsForList().leftPushAll("cart"+id,list);
        return new ResponseResult(CommonCode.SUCCESS);
    }

    @Override
    @PostMapping("/combineCart")
    public ListResponseResult combineCart(@RequestBody List<SellerCart> localCart, HttpServletRequest request) {
        String token = request.getHeader("Authorization");
        //获取用户ID
        Jwt decode = JwtHelper.decode(token);
        String claims = decode.getClaims();
        Map map = JSON.parseObject(claims, Map.class);
        String id = (String) map.get("id");

        //根据用户ID查询得到用户Redis中的购物车信息
        List<SellerCart> redisCart = redisTemplate.opsForList().range("cart" + id, 0, -1);

        //将localCart和redisCart进行合并
        //local:洛川苹果
        //redis:华为   apple    洛川苹果

        //对localCart做遍历
        for(SellerCart localSeller: localCart){
            //1。遍历出来的店铺在Redis中存在
            //2。遍历出来的店铺在Redis中不存在
            Boolean sellerFlag = false;
            for(SellerCart redisSeller:redisCart){
                if(localSeller.getSellerId().equals(redisSeller.getSellerId())){
                    sellerFlag = true;
                    //店铺存在，对localSeller中的每一件商品依次做遍历，判断每一件商品在redisSeller中是否存在
                    //存在：用localSeller中的商品数量覆盖掉redisSeller中的商品数量
                    //不存在：直接将localSeller中的商品追加redisSeller的商品集合中（items）

                    for(ItemCart localItem:localSeller.getItems()){
                        Boolean itemFlag = false;
                        for(ItemCart redisItem:redisSeller.getItems()){
                            if(localItem.getSkuid().longValue()==redisItem.getSkuid().longValue()){
                                itemFlag = true;
                                redisItem.setNum(localItem.getNum());
                            }
                        }
                        if(!itemFlag){
                            redisSeller.getItems().add(localItem);
                        }
                    }

                }
            }
            //对redis中所有店铺依次对比，没有相同的店铺
            if(!sellerFlag){
                redisCart.add(localSeller);
            }

        }
        //将合并之后的购物车集合覆盖到Redis
        redisTemplate.delete("cart"+id);
        redisTemplate.opsForList().leftPushAll("cart"+id,redisCart);
        QueryResult<SellerCart> queryResult = new QueryResult<>();
        queryResult.setList(redisCart);
        return new ListResponseResult(CommonCode.SUCCESS,queryResult);
    }

}
